package com.xiaoa.gossip.cluster.observer;

import com.xiaoa.gossip.cluster.command.NodeState;
import com.xiaoa.gossip.cluster.command.PingNodeState;

/**
 * 节点状态改变观察者
 *
 * @author luokaichuang
 * @time 2020/6/3
 */
public interface NodeStateObserver {


    /**
     * 返回观察的类型，子类实现
     *
     * @author jm008783
     * @param: []
     * @return: int
     **/
    public int observerStats();

    /**
     * 状态改变触发
     *
     * @param oldNode  老的节点
     * @param newNode  新改变的节点
     * @param pingNode 通知节点
     * @author jm008783
     * @param: [oldNode, newNode,pingNode]
     * @return: void
     **/
    default void doUpdate(PingNodeState oldNode, PingNodeState newNode, NodeState pingNode) {

        if (!newNode.getState().equals(oldNode.getState()) && newNode.getState().equals(observerStats())) {
            doProcessor(oldNode, newNode, pingNode);
        }
    }

    /**
     * 处理状态
     *
     * @param oldNode  老的节点
     * @param newNode  新改变的节点
     * @param pingNode 通知节点
     * @author jm008783
     * @param: [oldNode, newNode]
     * @return: void
     **/
    public void doProcessor(PingNodeState oldNode, PingNodeState newNode, NodeState pingNode);

}
